home *** CD-ROM | disk | FTP | other *** search
- {
- Program ..............: Vol.pas
- Purpose ..............: Manipulation of Disk Volume Labels.
- Implementation .......: Turbo Pascal v4.x, v5.x
-
- Original Code.........: Vernon E. Davis
- : 17 South Centre Street
- : Merchantville, NJ 08109
- : CompuServe [71330,2705]
-
- Revision....1/19/90...: Mikal B. Keenan
- : UAB Computer Science
- : Campbell Hall
- : University of Alabama at Birmingham
- : University Station
- : Birmingham, AL 35209
- : Compuserve 76167,1033
-
- ***********************************************************
- I hate to write documentation so I included the original DOC
- file with my revisions. Sorry I didn't include the original
- code Vern... once I started typing and saving - and getting
- my changes to work - I zipped my work back into the archive!
- I've made the routines much tighter and unrepetitive. Also
- wrote a functional LABEL program based on the original Vol-
- Test code. Enjoy folks - it was fun.
-
- reuploaded by Mikal Keenan 1/19/90
- ***********************************************************
- }
- {$V-}
- unit Vol;
-
- interface
-
- uses
-
- dos;
-
- type
-
- Drive = byte;
- VolumeName = string[11];
-
- VolFCB = record
- FCB_Flag : byte;
- Reserved : array[1..5] of byte;
- FileAttr : byte;
- Drive_ID : byte;
- FileName : array[1..8] of byte;
- File_Ext : array[1..3] of byte;
- Unused_A : array[1..5] of byte;
- File_New : array[1..8] of byte;
- fExt_New : array[1..3] of byte;
- Unused_B : array[1..9] of byte
- end;
-
- function DelVol (D:Byte):Boolean;
- function AddVol (D:Byte; V:VolumeName):Boolean;
- function ChgVol (D:Byte; V:VolumeName):Boolean;
- function GetVol (D:Byte):VolumeName;
-
- implementation
-
- procedure Pad_Name (var V:VolumeName);
- begin
- while Length (V) <> 11 do
- V:= V + ' '
- end;
-
- function Fix_Ext_Sym (var V:VolumeName):byte;
- var
- I : byte;
- begin
- I:= Pos ('.',V);
- if I > 0 then
- Delete (V,I,1);
- Fix_Ext_Sym:= I
- end;
-
- function Extract_Name (S:SearchRec):VolumeName;
- var
- H, I : Byte;
- begin
- I:= Fix_Ext_Sym (S.Name);
- if (I > 0) and (I < 9) then
- for H:= 1 to (9 - I) do
- Insert (' ', S.Name, I);
- Extract_Name:= S.Name
- end;
-
- procedure Fix_Name (var V:VolumeName);
- var
- I : byte;
- begin
- Pad_Name (V);
- for I:= 1 to 11
- do V[I]:= Upcase (V[I])
- end;
-
- function Valid_Drive_Num (D:Byte):Boolean;
- begin
- Valid_Drive_Num:= (D >= 1) and (D <= 26)
- end;
-
- function Find_Vol (D:Byte; var S:SearchRec):boolean;
- begin
- FindFirst (chr (D+64) + ':\*.*',VolumeID, S);
- Find_Vol:= DosError = 0
- end;
-
- procedure Fix_FCB_NewFile (V:VolumeName; var FCB:VolFCB);
- var
- I : byte;
- begin
- for I:= 1 to 8 do
- FCB.File_New[I]:= ord (V[I]);
- for I:= 1 to 3 do
- FCB.fExt_New[I]:= ord (V[I+8])
- end;
-
- procedure Fix_FCB_FileName (V:VolumeName; var FCB:VolFCB);
- var
- I : byte;
- begin
- for I:= 1 to 8 do
- FCB.FileName[I]:= ord (V[I]);
- for I:= 1 to 3 do
- FCB.File_Ext[I]:= ord (V[I+8])
- end;
-
- function Vol_Int21 (Fnxn:word; D:Drive; var FCB:VolFCB):boolean;
- var
- Regs : registers;
- begin
- FCB.Drive_ID:= D;
- FCB.FCB_Flag:= $FF;
- FCB.FileAttr:= $08;
- Regs.DS := Seg (FCB);
- Regs.DX := Ofs (FCB);
- Regs.AX := Fnxn;
- Msdos (Regs);
- Vol_Int21:= Regs.AL = 0
- end;
-
- function DelVol (D:Byte):Boolean;
- var
- sRec : SearchRec;
- FCB : VolFCB;
- V : VolumeName;
- begin
- DelVol:= false;
- if Valid_Drive_Num (D) then
- begin
- if Find_Vol (D, sRec) then
- begin
- V:= Extract_Name (sRec);
- Pad_Name (V);
- Fix_FCB_FileName (V, FCB);
- DelVol:= Vol_Int21 ($1300, D, FCB)
- end
- end
- end;
-
- function AddVol (D:Byte; V:VolumeName):Boolean;
- var
- sRec : SearchRec;
- FCB : VolFCB;
- begin
- AddVol:= false;
- if Valid_Drive_Num (D) then
- begin
- if not Find_Vol (D, sRec) then
- begin
- Fix_Name (V);
- Fix_FCB_FileName (V, FCB);
- AddVol:= Vol_Int21 ($1600, D, FCB)
- end
- end
- end;
-
- function ChgVol (D:Byte; V:VolumeName):Boolean;
- var
- sRec : SearchRec;
- FCB : VolFCB;
- x : byte;
- begin
- ChgVol:= false;
- if Valid_Drive_Num (D) then
- begin
- if Find_Vol (D, sRec) then
- begin
- x:= Fix_Ext_Sym (V);
- Fix_Name (V);
- Fix_FCB_NewFile (V, FCB);
- V:= Extract_Name (sRec);
- Pad_Name (V);
- Fix_FCB_FileName (V, FCB);
- ChgVol:= Vol_Int21 ($1700, D, FCB)
- end
- end
- end;
-
- function GetVol (D:Byte):VolumeName;
- var
- sRec : SearchRec;
- begin
- GetVol:= '';
- if Valid_Drive_Num (D) then
- if Find_Vol (D, sRec) then
- GetVol:= Extract_Name (sRec)
- end;
-
- end.